#ifndef  __DATSTRUCT_H_
#define  __DATSTRUCT_H_

#include "stm32f4xx.h"

#define STOPL_EN     ( 0X00000001 )  // 左停止有效
#define STOPR_EN     ( 0X00000002 )  // 右停止有效
#define STOPL_L_EN   ( 0X00000000 )  // 左输入低有效
#define STOPL_H_EN   ( 0X00000004 )  // 左输入高有效
#define STOPR_L_EN   ( 0X00000000 )  // 右输入低有效
#define STOPR_H_EN   ( 0X00000008 )  // 右输入高有效
#define STOPL_N_XLATCH  ( 0X00000400 )
#define STOPL_E_XLATCH  ( 0X00000800 )
#define STOPR_N_XLATCH  ( 0X00001000 )
#define STOPR_E_XLATCH  ( 0X00002000 )
#define NEDDLE_CLACH_STOP_H ( 0X00030000 )
#define NEDDLE_CLACH_STOP_L ( 0X000C0000 )
#define STOPL_ACTIVE  ( 0X00000080 )
#define STOPR_ACTIVE  ( 0X00000100 )
/*开环板子速度寄存器值 = r/m * 895;
	闭环有8位小数,需要在乘以256*/
#define PROTO_V_TO_4361_REG(pv)	(pv*256)

enum{
	POS_REACHED,
	POS_RUNNING,
};
typedef struct {
	uint8_t  SPI_Status;
	uint32_t speed_home;
	/*stall_tick 记录最近一次错误时间*/
	uint32_t stall_tick;
	
	/*统计一次运动过程的平均速度防止电机速度变慢的异常*/
	uint32_t pos_status; /*表示运动到位*/
	uint32_t start_tick;
	uint32_t stop_tick;
	int32_t last_relative;/*相对运动位置步数*/
	
	uint32_t REFERENCE_CONF;		/*0x01参考开关寄存器*/
	int32_t ENC_POS;						/*0x50编码器实际位置寄存器*/
	int32_t ENC_POS_DEV;				/*0x52编码器实际位置和电机实际位置之差*/
	int32_t CL_OFFSET;					/*0x59校准后编码器实际位置和电机实际位置之差*/
	int32_t XACTUAL;						/*0x21实际位置寄存器*/
	int32_t XTARGET;						/*0x37目标位置寄存器*/
	int32_t X_LATCH;						/*0x36在复位后触发 将当前实际位置存到该寄存器*/
	int32_t V_ENC;							/*0x65编码器速度*/
	uint32_t EVENTS;						/*0x0E触发事件寄存器*/
	uint32_t STATUS;						/*0x0F状态寄存器 包含限位光电 速度到达 位置到达etc*/
	int32_t	X_RANGE;						/*0x36寄存器写入后 电机会认为在-XRANGE和+XRANGE之间是一个首尾相连的圆*/
	int32_t NEDDLE_CLASH_SET;   /*撞针配置寄存器*/
	int32_t stall_timer;
	int32_t rewriting;
	
	int32_t ENC_HOME_POS;				/*回原完成后记录当前编码器位置 方便读取位置功能读取相对原点位置*/
	
	int32_t U_XACTUAL;
	
	int32_t PROTO_CURRENT;			/*协议电流*/
	int32_t PROTO_V;						/*协议转速 与开环统一,数值为转速*895*/
	int32_t PROTO_RESET_V;			/*协议复位转速 与开环统一,数值为转速*895*/
	int32_t PROTO_XTATGET;			/*由于闭环中复位点目标位置不为零,而是X_LATCH所以与*/
	int32_t PROTO_XACTURAL;			/*上位机协议中的位置参数总是相差X_LATCH*/
	
	uint32_t PROTO_STATUS;			/*协议中0x32电机状态寄存器*/
	uint8_t HOMEING_CMD; 				/*复位命令类型*/
	uint8_t HOMING_FLAG;				/*复位状态寄存器*/
	
	uint8_t SURFACE_STATUS;			/*液面探测状态*/
	uint8_t SURFACE_ENABLE;			/*液面探测使能寄存器*/
	
	uint8_t LIMIT_SWITCH_CMD; 
	
	uint8_t (*bsp_write_reg)(uint8_t,uint32_t);
	uint8_t (*bsp_read_reg)(uint8_t,uint32_t*);
	void (*bsp_nfreeze)(uint8_t freeze);
}TypeDefTMC4361_RegStruct;

/*4361的状态寄存器*/
typedef enum{
	ACTUAL_EQ_TAR     = 0x00000001,
	VACTUAL_EQ_VMAX   = 0x00000004,
	VACTURAL_POSITIVE = 0x00000008,
	VACTURAL_NEGETIVE = 0x00000010,
	STOPL_ACTIVE_F    = 0x00000080,
	STOPR_ACTIVE_F    = 0x00000100,
	STALL_DECTED	= 0x00000800,
	ENC_OVER_TOL	= 0x00004000,
	HOME_FINISH		= 0x00010000,
	NEDDLE_CRASH	= 0x4000000C,
	NEDDLE_CRASH_L	= 0x4000080C,
	NEDDLE_CRASH_R	= 0x4000100C,
	STALLGUARD		= 0x01000000,
}tmc4361_status_t;
#endif


